JasperReportsで帳票出力してみた
渡辺です。
現在開発しているシステムで帳票出力を実装したいなと思いまして、Javaの帳票系ライブラリを調べてみました。ここ5-6年はエンプラ系のシステムからは比較的に遠い場所にいたのですが、フリーで使えるライブラリとなるとPOIでExcel帳票にするか、JasperReportsを使うかの2択であることは変わっていないようです。有償のツールを見ると、帳票自体の機能よりもデータ分析などに価値付けがシフトしているようですね。
現在担当しているシステムは有償のライブラリを使うほど帳票が重要なシステムではありません。JasperReportsは7-8年ほど前に業務で使ったことがあり、現在もメンテナンスされているようだったので、JasperReportsを試してみました。
JasperReportsとは?
JasperReportsは、Jaspersoft社が開発している帳票用のライブラリです。正確には、JasperReports Libraryという名称で、帳票を処理するためのJavaのライブラリです。独自のXMLフォーマットで定義したテンプレートを元に帳票を作成し、PDFやExcelなどに出力することができます。
テンプレートとなるXMLファイルは手書きすることも可能ですが、通常は専用のデザインツールを利用します。このデザインツールはJaspersoft Studioと呼ばれます。以前はiReport Designerという名称でした。Jaspersoft StudioはEclipse Platformがベースのデザインツールで、帳票のレイアウトやサンプルデータの表示などを行うことができます。
なお、JasperReports系のプロダクトとして、サーバアプリケーションとして利用するJasperReports Serverや、ビッグデータやクラウドサービスなどに対応したエンタープライズ向けのエディションもあるようです。ですが、ちょっとした業務システムで帳票を出力したいという用途であれば、JasperReports LibraryとJaspersoft Studioがあれば充分に対応できます。
バージョン
調査を行った2013年12月時点では、2013年4月30日リリースのバージョン5.5.0が最新版でした。現在も継続的なリリースがされているので不安なく利用できるでしょう。なお、スタンドアロンのJavaアプリとして使う場合にちょっとした不具合があるのですが、次のバージョンでは修正されるようです(後述)。
ライセンス
JasperReports LibraryはLGPL、Jaspersoft StudioはEclipse Licenseで利用できます。したがって、通常の利用範囲であれば業務用途に利用しても問題ありません。
なお、JasperReports Libraryは、PDF生成でiTextを利用します。ところが、iTextの最新バージョンではライセンスがAGPLに変更されており、実質的にはコマーシャルライセンスを購入しない限り業務アプリケーションでは利用できません(version 5以降)。このため、JasperReportsのライセンスも心配だったのですが、JasperReportsは現在のバージョンでもLPGL時代のiTextを利用しています。
日本語フォント
PDF出力する時のフォントの扱いとして、PDFにフォントを埋め込む方式と、フォントを埋め込まず表示する環境のフォントを利用する方式があります。PDFにフォントを埋め込んだ場合、フォントの違いによるレイアウト崩れやイメージの違いに悩まされることはありませんが、フリーのフォントを使うか有償フォントのライセンスを購入しなければなりません。
英語であればフリーのフォントも沢山ありますが、日本語でフリーのフォントとなると限られます。今回は定番のIPAフォントを利用したいと思います。後ほど設定するのでダウンロードしておいてください。
帳票作成の流れ
JasperReportsで帳票出力するには次の流れで行います。
- テンプレートとなるXMLを作成する(Jaspersoft Studio)
- テンプレートを読み込み、データを差し込んで、PDFなど好みの形式に出力する(Java)
それでは簡単な帳票を作成していきましょう。
JRXMLの作成
はじめにテンプレートとなるXML(JRXML)をJaspersoft Studioを使って作成します。
Jaspersoft Studioのインストール
Jaspersoft Studio(旧iReport)をダウンロードしてインストールしてください。プラットフォーム毎にインストーラーが用意されているので説明は省略します。
プロジェクトの作成
はじめにプロジェクトを作成します。Fileメニューから[New]-[Project]と選択し、Jaspersoft Studioから「JasperReports Project」を選択します。プロジェクト名は適当に付けてください。
フォントの設定
プロジェクトを作成したならば、プロジェクトのプロパティを開き、フォントを設定します。[Jaspersoft Studio]-[Fonts]を開き、Addでフォントを追加します。
この時、[Family Name]を「ipaex」とし、ダウンロードしたttfファイルを指定します。また、PDF Detailsの[PDF Encoding]を「identitiy-H」に設定し、[Embed this font in PDF]にチェックを入れてください。
なお、このフォント設定はJaspersoft Studioでプレビューを行う場合などに利用されます。Javaのプログラムからフォントを設定する方法は後述しますが、Family Nameがキーとなるので間違えないように注意してください。
サンプルデータの作成
Jaspersoft Studioでは、サンプルデータなどを読み込んで帳票のプレビューを表示することができます。サンプルデータはCSVやRDBなど様々なフォーマットに対応しています。
ここではCSVファイルを使い、次のようなデータを作成しました。1行目がヘッダとなるシンプルなCSVファイルです。
CODE,DATE,DISTANCE,NAME BRM505,2014-5-5,200,北海道200km十勝 BRM524,2014-5-24,300,北海道300km留萌 BRM614,2014-6-14,400,北海道400km雄武 BRM709,2014-7-9,1200,北海道1200km納沙布岬 BRM809,2014-8-9,600,北海道600km大雪 BRM830,2014-8-30,300,北海道300km札幌新パノラマ BRM921,2014-9-21,200,北海道200km大夕張 BRM1012,2014-10-12,400,北海道400km函館
プロジェクトの直下に、brm.csvという名前のテキストファイルを作成して保存してください。
DataAdapterの作成
次にデータを提供するための設定ファイルであるDataAdapterを作成します。
DataAdapterを作成するには、コンテキストメニューより[New]-[Data Adapter]を選択します。名前はexample.xmlとしました。
続けて利用するDataのソースを選択します。ここでは先ほど作成したCSV Fileを選択します。
ファイルを選択したならば、[Get columns name from the first row of the file]ボタンをクリックし、ヘッダ行を読み込んでください。カラム名が自動的にインポートされます。
なお、DataAdapterの対象としては、JSONやMongoDBなどにも対応してました。
テンプレートファイルの作成
それでは最後にテンプレートファイルを作成しましょう。コンテキストメニューより[New]-[Jasper Report]を選択します。New Report Wizardが表示されるので、ここでは「Blank A4」を選択して[Next]をクリックします。
次の画面でファイル名を入力します。example.jrxmlと入力し、[Next]を押してください。
続けてDataAdapterの選択画面となります。先ほど作成したbrm - exampleを選択して、[Next]を押しましょう。
次はDataAdapterに定義されているカラムから帳票で使いたいカラムの選択です。とりあえず今回は全部追加しておきましょう。
Groupは今回利用しないため、何も選択せずに[Finish]してください。JRXMLファイルが作成されると、次のような画面になります。
中央にあるのが帳票のデザインを行う領域で、右側に配置するフィールドなどを含むパレットがあります。各コンポーネントは左下のアウトラインで確認することができ、右下のプロパティで情報を変更することができます。
帳票フォーマットで利用するプログラミング言語の設定
JasperReportsでは帳票の中にコードを埋め込み、フォーマットなどに利用することができます。対応する言語はJavaだけではなくGroovyやJavaScriptなどがありますが、デフォルトはGroovyとなっています。
当然、Groovy環境で帳票出力するのであればデフォルト設定がベストですが、今回はJava環境で実行させたいので変更しなければ、実行時エラーとなります。
Outlineでルート要素(example)を選択し、PropertiesのLanguageをJavaに変更してください。
帳票の構造とBand
JasperReportsの帳票の構造では、Bandと呼ばれる領域が重要です。
Outlineの下の方をみてください。Title,Page Headerといった領域が表示されています。これらは、Bandと呼ばれる領域です。デザイナにも対応するBandが表示されています。
JasperReportsではどのBandに配置するかで出力される帳票の見栄えが異なってきます。とりあえずおさえておくべきは、Titel, Column Header, Detailの3つです。
Title
Titleは固定で最初に表示されるBandです。帳票のタイトルをレイアウトします。
Column Header
Column Headerは、帳票のヘッダをレイアウトします。
Detail
Detailは、データが繰り返して挿入される領域です。各データの要素をレイアウトします。
今回は、これらの3つのBand以外を使いません。Bandの名前を右クリックし、Deleteで削除しておきましょう。
タイトルの作成
タイトルなどデータに依存しない固定文字はStatic Textで作成します。PaletteからStatic Textを選択し、ドラッグ&ドロップでTitle Bandに配置します。
配置した後はPropertiesを設定し、見栄えを整えてください。また、フォントをIPAexにすることを忘れずに行います。
ヘッダの作成
カラムヘッダも同様にStatic Textで定義します。Code, Date, Distance, Nameをバランス良く配置してください。Propertiesを調整することで、枠線を書くこともできます。
カラムを追加したならば、Bandの高さを調整してください。コンテキストメニューの[Strech To Content]を使うと便利です。
データ行の作成
最後にデータ行をDetail Bandに作成します。
データ行はText Fieldとして作成します。Text Fieldをドラッグ&ドロップしたならば、ダブルクリックでエディタを起動し、Fieldsの項目を選択してください。
例えば、$F{CODE}でCODEが挿入されます。他にも様々な関数が利用できるので帳票に応じて使いこなしましょう。
最終的に各カラムのヘッダとデータ行を追加し、次のようなレイアウトを作成しました。
プレビュー
各Bandの設定が完了したならば、Previewタブを開いてください。自動的にコンパイルが行われて、プレビューが表示されます。
簡単ですね。
JasperReports Libraryによる帳票出力
それでは続けて、JavaのプログラムからPDFを出力してみましょう。お使いのIDEで適当なJavaプロジェクトを作成してください。ここでは、Java1.7 + Gradleの環境を前提として説明します。
依存ライブラリの追加
JasperReports LibraryはMaven Repositoryで公開されているので、次のようにpom.xmlやbuild.gradleの依存ライブラリに追加すればOKです。
dependencies { compile 'net.sf.jasperreports:jasperreports:5.5.0' }
ただし、注意点が2つあります。
itext-2.1.7.js2
JasperReports LibraryはPDFを出力する場合にitextを利用しますが、この時に依存しているバージョンはLGPLである2.1系の最新バージョンである2.1.7にJasperReportsで独自のパッチを当てた、2.1.7.js2です。このバージョンはMavenのcentral repositoryに存在しないため、Jaspersoftのリポジトリを追加しなければなりません。
repositories { mavenCentral() maven { url 'http://jasperreports.sourceforge.net/maven2/' } }
servlet-api
JasperReports Library 5.5のバグとして、「スタンドアロンのJavaアプリケーションで利用する時、Servlet APIに含まれるクラスに依存しているため例外(ClassNotFoundException)が発生する」ことが知られています。次のバージョンでは修正されるとのことですが、現時点では5.5を回避するか、依存ライブラリに追加することになります。依存ライブラリとして追加する場合は、次のようにdependenciesに追加しましょう。
dependencies { compile 'net.sf.jasperreports:jasperreports:5.5.0' compile 'javax.servlet:servlet-api:2.5' }
フォントの設定
JRXMLファイルは帳票のレイアウトを定義したファイルであり、フォントは埋め込まれていません。JasperReports Libraryに含まれるフォントは利用できますが、追加したフォントはJavaのリソースとして読み込めるような設定をしなくてはなりません。
jasperreports_extension.properties
リソースフォルダにjasperreports_extension.propertiesを作成します。名前から解るようにJasperReportsの拡張プロパティファイルです。
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.ipaex=fonts/ipaex.xml
2行目が追加するフォントファミリーです。
fonts/ipaex.xml
次にフォントの設定を行います。リソースフォルダにfontsパッケージを作成し、ipaex.xmlを追加します。このファイルはプロパティファイルから参照されるフォントの設定ファイルです。
<?xml version="1.0" encoding="UTF-8"?> <fontFamilies> <fontFamily name="ipaex"> <normal>fonts/ipaexg.ttf</normal> <pdfEncoding>Identity-H</pdfEncoding> <pdfEmbedded>true</pdfEmbedded> </fontFamily> </fontFamilies>
fontFamilyのname属性は、JRXMLファイルに定義されたフォント名と一致させてください。フォントの実体(ttf)へのパスを記述します。必要に応じてboldやitalicのフォントも追加してください。
フォントの追加
最後にipaex.xmlファイルと同じパッケージにTTFファイルをコピーします。
サンプルコード
JasperReports Libraryの仕組みはシンプルです。
JasperCompileManager
クラスはJRXMLをコンパイルし、JasperReportオブジェクトを生成します。JasperReportオブジェクトは、パラメータとデータセット(JRDataSet)を流し込むことで、抽象的な帳票オブジェクト(JasperPrint)を生成します。最後にJasperExportManagerクラスを使い、JasperPrintを好みのフォーマット(PDFやExcel)に出力します。
これらの手順をコードで書けば次のようになります。
public class JasperMain { public static void main(String[] args) throws Exception { Map<String, Object> parameters = new HashMap<>(); JRCsvDataSource dataSource = new JRCsvDataSource(JasperMain.class.getResourceAsStream("brm.csv")); dataSource.setUseFirstRowAsHeader(true); try (InputStream template = JasperMain.class.getResourceAsStream("example.jrxml")) { JasperReport report = JasperCompileManager.compileReport(template); JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters, dataSource); JasperExportManager.exportReportToPdfFile(jasperPrint, "example.pdf"); } } }
Jaspersoft Studioで作成したJRXMLファイルとサンプルのCSVはリソースフォルダの同一パッケージに配置してください。
このプログラムを実行すれば、プロジェクトのルートフォルダにsample.pdfが生成されるでしょう。
なお、JRDataSetはJaspersoft Studioでみたように、JSONやJavaBeansなどにも対応しています。検証用にはCSVなど確認しやすいテキストフォーマットを利用し、サーバアプリケーションであるならばSQLで直接データを取得したり、一度ドメインオブジェクトに変換したあと帳票に出力するなどが可能です。
まとめ
駆け足となりましたが、Jaspersoft StudioとJasperReports Libraryを利用してJavaで帳票を出力する流れを解説しました。印象として7-8年前に使った時と大きく変化しているところはありませんでした。しいて言えば、MongoDBやJSONなどモダンなデータソースに対応していたり、Groovyがデフォルトになっていたりと近代化には乗り遅れていないな、という印象です。
ライセンス料を払うほどでもない帳票要件は多いと思います。Javaの場合はまだまだJasperReportsを使うという選択で良いのではないでしょうか。